package com.inspinia.message.rpc.api;

import com.inspinia.base.service.BaseService;
import com.inspinia.message.common.model.Notice;
import com.inspinia.message.common.model.NoticeAddresseeType;
import com.inspinia.message.common.model.NoticeLinkType;
import org.springframework.transaction.annotation.Transactional;

import java.util.Collection;

/**
 * 通知的服务层接口
 * Created by heshun on 2018-1-8.
 */
public interface NoticeService extends BaseService<Notice> {

    /**
     * 推送通知
     *
     * @param id            通知id
     * @param addresseeType 接收者类型
     * @param addresseeIds  接收者id集合
     */
    void push(Long id, NoticeAddresseeType addresseeType, Collection<Long> addresseeIds);

    /**
     * 推送
     *
     * @param bean
     * @param addresseeType 接收者类型
     * @param addresseeIds  接收者id集合
     */
    void push(Notice bean, NoticeAddresseeType addresseeType, Collection<Long> addresseeIds);

    /**
     * 推送消息
     *
     * @param id      通知id
     * @param userIds 用户id集合
     */
    void pushAndSaveLog(Long id, Collection<Long> userIds);

    /**
     * 推送消息
     *
     * @param id
     */
    void push(Long id);

    /**
     * 推送消息
     *
     * @param addresseeIds 接收人id集合
     * @param linkType     关联类型
     * @param linkData     关联数据
     * @param content      消息内容
     */
    void push(Collection<Long> addresseeIds, NoticeLinkType linkType, Object linkData, String content);

    /**
     * 推送消息
     *
     * @param addressId 接收人id
     * @param linkType  关联类型
     * @param linkData  关联数据
     * @param content   消息内容
     */
    void push(Long addressId, NoticeLinkType linkType, Object linkData, String content);

    /**
     * 获取未读消息数量
     *
     * @param userId 用户id
     * @return
     */
    int countUnread(Long userId);

    /**
     * 提示类型的通知，不会保存通知和推送记录到数据库。
     *
     * @param addresseeIds 接收人id集合
     * @param linkType     关联类型
     * @param linkData     关联数据
     * @param content      消息内容
     */
    void prompt(Collection<Long> addresseeIds, NoticeLinkType linkType, Object linkData, String content);

    @Transactional
    void deleteDayBefore(int day);
}